/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：太平金科-基础组件封装层-SpringBoot组件封装-缺省实现
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taipingframework.boot.web.exception.error;

import cn.hutool.json.JSONUtil;
import com.taipingframework.utility.constant.ApplicationConstant;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.web.error.ErrorAttributeOptions;
import org.springframework.boot.web.reactive.error.DefaultErrorAttributes;
import org.springframework.web.reactive.function.server.ServerRequest;

import java.util.Map;

/**
 * spring-webflux全局异常处理 - 自定义错误属性
 */
public class GlobalErrorAttributes extends DefaultErrorAttributes {

    public GlobalErrorAttributes() {
        super();
    }

    @Override
    public Map<String, Object> getErrorAttributes(ServerRequest request, ErrorAttributeOptions options) {
        /* *****====== 这种方式很不优雅，也不美观仅作为一种等效的实现思路 ======***** */
        // 在正常的业务编码中捕获异常后这样传递参数
        // ServerWebExchange serverWebExchange = context.get(ServerWebExchange.class);
        // serverWebExchange.getAttributes().put(ApplicationConstant.RESPONSE_API_RESULT, apiResultJson);
        // 在全局异常处理程序中这样获取被传递过来的参数
        String errJson = request.exchange().getAttribute(ApplicationConstant.RESPONSE_API_RESULT);

        Map<String, Object> errorAttributes = super.getErrorAttributes(request, options);
        if (StringUtils.isNotEmpty(errJson) && JSONUtil.isTypeJSON(errJson)) {
            errorAttributes.put(ApplicationConstant.RESPONSE_API_RESULT, errJson);
        }
        return errorAttributes;
    }

}
